/**
*****************************************************************************
 * @file func_DownMode.h
 * @brief 下行设备读取功能函数
 * @author Moon
 * @version V1.0.0
 * @date 2022/09/13
****************************************************************************
 */
#ifndef _FUNC_DOWNMODE_H
#define _FUNC_DOWNMODE_H

#include <stdint.h>
#include "DownComm.h"

#ifndef DOWNMODE_NUM
#define DOWNMODE_NUM    128
#endif
typedef struct func_DownMode func_DownMode_t;

/**
 * 下行通讯类型
 */
typedef enum
{
    ComType_User = CommLevel0,  //用户通信
    ComType_Trans = CommLevel1, //临时转发
    ComType_Cycle = CommLevel2, //周期通信

    ComType_NUM = 3,            //任务类型数量
} DOWN_TYPE;

typedef enum
{
    ST_SERIAL_COMM_Idle = 0,     //空闲
    ST_SERIAL_COMM_Send,         //任务发
    ST_SERIAL_COMM_ReSend,       //任务重发送
    ST_SERIAL_COMM_Recv,         //任务回复
    ST_SERIAL_COMM_End,          //任务结束
} ST_COMM_STATUS;

typedef struct
{
    ST_COMM_STATUS state;                   //当前通信状态
    uint16_t       Cnt;                     //当前发送次数
    int32_t        idleTime;                //当前线路空闲时间
    int32_t        waitOut;                 //当前帧等待时间 单位ms
    int32_t        sendLen;                 //当前数据发送长度
    DOWN_COMM_TASK *pNowTask;               //当前通信任务指针
    DOWN_COMM_TASK taskThread[ComType_NUM]; //通信任务线程
    
} FunDownMode_private_t;

/* Private Struct ---------------------------------------------------------------*/
struct func_DownMode
{
    /* ***************Public Parameter  *************** */
    uint16_t outTime;       //超时时间 单位：ms
    uint16_t SendCnt;       //重发次数
    uint16_t IdleDelay;     //线路空闲间隔 单位ms
    uint32_t (*send_data)(uint8_t *data, uint32_t len);
    /* ***************Public Method     *************** */
    void (*read_callback)(func_DownMode_t *, uint8_t *data, uint32_t len);
    void (*DownMode_task)(func_DownMode_t *, uint16_t timebase);

    bool (*CommTaskIsBusy)(func_DownMode_t *, DOWN_TYPE type);
    bool (*CommTaskCancel)(func_DownMode_t *, DOWN_TYPE type);
    bool (*CommTaskApply)(func_DownMode_t *, DOWN_TYPE type,
                          F_TaskState *pSt, F_TaskSend *pTx, F_TaskRecv *pRx);
    /* ***************Private Attributes*************** */
    FunDownMode_private_t private;
};
/* Public enum -----------------------------------------------------------*/

/* Public Variable ---------------------------------------------------------*/
//Pointer
//Array
//Const
/* Pubilc function prototypes -----------------------------------------------*/
int Func_DownMode_Init(func_DownMode_t *this);

#endif
